#include "Inf_WS2812.h"
#include "led_strip.h"

// 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution)
#define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000)
// 设置内存块大小，根据 LED 数量和 DMA 特性进行调整
#define LED_STRIP_MEMORY_BLOCK_WORDS 0
// 不使用 DMA 时，设置为 0
#define LED_STRIP_USE_DMA 0

/* 定义几种常见颜色 */
uint8_t black[3] = {0, 0, 0};
uint8_t white[3] = {255, 255, 255};
uint8_t red[3] = {0, 255, 0};
uint8_t green[3] = {255, 0, 0};
uint8_t blue[3] = {0, 0, 255};
uint8_t cyan[3] = {255, 0, 255};   /* 青色 */
uint8_t purple[3] = {0, 255, 255}; /* 紫色 */

// LED 灯带句柄
static led_strip_handle_t led_strip = NULL;

/**
 * @brief 初始化 WS2812
 *
 */
void Inf_WS2812_Init(void)
{
    // 配置 LED 灯带的通用参数，根据 LED 板设计进行设置
    led_strip_config_t strip_config = {
        // 连接到 LED 灯带数据线的 GPIO 引脚
        .strip_gpio_num = LED_PIN,
        // LED 灯带中的 LED 数量
        .max_leds = LED_STRIP_LED_COUNT,
        // LED 灯带型号
        .led_model = LED_MODEL_WS2812,
        // LED 灯带颜色顺序：GRB
        .color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_RGB,
        .flags = {
            // 不反转输出信号
            .invert_out = false,
        }};

    // LED 灯带后端配置：RMT
    led_strip_rmt_config_t rmt_config = {
        // 不同的时钟源可能导致不同的功耗
        .clk_src = RMT_CLK_SRC_DEFAULT,
        // RMT 通道号，用于驱动 LED 灯带
        .resolution_hz = LED_STRIP_RMT_RES_HZ,
        // RMT 通道的内存块大小，用于存储 LED 数据
        .mem_block_symbols = LED_STRIP_MEMORY_BLOCK_WORDS,
        .flags = {
            .with_dma = LED_STRIP_USE_DMA, // Using DMA can improve performance when driving more LEDs
        }};

    // LED Strip object handle

    led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip);

    MY_LOGE("初始化成功");
}

/**
 * @brief 灯带颜色
 * @param key 按键
 * @param color 颜色
 */
esp_err_t Inf_WS2812_LEDOn(Touch_Key key, uint8_t *color)
{
    // 点亮那个
    esp_err_t err = led_strip_set_pixel(led_strip, key, color[0], color[1], color[2]);
    // 发送数据亮灯
    led_strip_refresh(led_strip);
    return err;
}

/**
 * @brief 关闭 全部
 */
esp_err_t Inf_WS2812_LEDOff(void)
{
    led_strip_clear(led_strip);
    led_strip_refresh(led_strip);
    return ESP_OK;
}


esp_err_t Inf_WS2812_PMD(void){

    bool led_on_off = false;

    while (1) {
        if (led_on_off) {
            /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */
            for (int i = 0; i < LED_STRIP_LED_COUNT; i++) {
                led_strip_set_pixel(led_strip, i, 5, 5, 5);
            }
            /* Refresh the strip to send data */
            led_strip_refresh(led_strip);
        } else {
            /* Set all LED off to clear all pixels */
            led_strip_clear(led_strip);
        }

        led_on_off = !led_on_off;
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}